#include <stdio.h>
#include <string.h>
#define int long long
char *operations[] = {"+", "-", "*", "/", "=", "#", "<", "<=", ">", ">=", ":="};
char *keyword[] = {"lhr", "const", "cg", "var", "procedure", "begin", "end", "odd", "if", "then", "call", "while", "do", "read", "write", "studentid", "数字", "name", "zlz"};
char *bound[] = {"(", ")", ",", ";", "."};
int num;
// const char *outputfile = "output.txt";
// void lohfile(const char *outputfile)
// {
//      FILE *fp = fopen(outputfile, "a");
//      fputs()
// }
void check(char *a1)
{
    if (strlen(a1) == 0)
        return;
    a1[strlen(a1) - 1] = '\0';
    if (strlen(a1) != 0)
    {
        int flag = 0;
        for (int i = 0; i < sizeof(keyword) / sizeof(keyword[0]); i++)
        {
            if (strcmp(a1, keyword[i]) == 0)
            {
                printf("%lld 基本字 %s\n", ++num, a1);
                flag = 1;
            }
        }
        if (flag)
        {
            strncpy(a1, "", sizeof(a1));
            return;
        }
        if ((a1[0] >= 'A' && a1[0] <= 'Z') || (a1[0] >= 'a' && a1[0] <= 'z'))
        {
            printf("%lld 标识符 %s\n", ++num, a1);
        }
        else
        {
            int flag = 0;
            for (int i = 0; i < strlen(a1); i++)
            {
                if (a1[i] <= '9' && a1[i] >= '0')
                {
                }
                else
                {
                    flag = 1;
                }
            }
            if (flag == 0)
                printf("%lld 数字 %s\n", ++num, a1);
            else
                printf("%lld 非法 %s\n", ++num, a1);
        }
    }
    strncpy(a1, "", sizeof(a1));
}

signed main()
{
    char s[1000];
    FILE *fp;
    fp = fopen("CodeText.txt", "r");
    while (fgets(s, sizeof(s), fp) != NULL)
    {
        s[strlen(s) - 1] = '\0';
        int pos = 0;
        char sa[1000] = "";
        while (pos < strlen(s))
        {
            sa[strlen(sa)] = s[pos];
            if (s[pos] == ' ')
            {
                check(sa);
            }
            else if (s[pos] == ':')
            {
                if (s[pos + 1] == '=')
                {
                    check(sa);
                    pos++;
                    printf("%lld 运算符 :=\n", ++num);
                }
                else
                {
                    check(sa);
                    printf("%lld 非法 :\n", ++num);
                }
            }
            else if (s[pos] == '>')
            {
                if (s[pos + 1] == '=')
                {
                    check(sa);
                    pos++;
                    printf("%lld 运算符 >=\n", ++num);
                }
                else
                {
                    check(sa);
                    printf("%lld 运算符 >\n", ++num);
                }
            }
            else if (s[pos] == '<')
            {
                if (s[pos + 1] == '=')
                {
                    check(sa);
                    pos++;
                    printf("%lld 运算符 <=\n", ++num);
                }
                else
                {
                    check(sa);
                    printf("%lld 运算符 <\n", ++num);
                }
            }
            else
            {
                char one[2] = "";
                one[0] = s[pos];
                one[1] = '\0';
                int flag = 0;
                for (int i = 0; i < sizeof(bound) / sizeof(bound[0]); i++)
                {
                    if (strcmp(one, bound[i]) == 0)
                    {
                        check(sa);
                        printf("%lld 界符 %s\n", ++num, bound[i]);
                        if (bound[i][0] == '.')
                            return 0;
                        flag = 1;
                        break;
                    }
                }
                if (flag == 0)
                {
                    for (int i = 0; i < sizeof(operations) / sizeof(operations[0]) - 5; i++)
                    {
                        if (strcmp(one, operations[i]) == 0)
                        {
                            check(sa);
                            printf("%lld 运算符 %s\n", ++num, operations[i]);
                            break;
                        }
                    }
                }
            }
            pos++;
        }
        if (strlen(sa) != 0)
        {
            int flag = 0;
            for (int i = 0; i < 13; i++)
            {
                if (strcmp(sa, keyword[i]) == 0)
                {
                    printf("%lld 基本字 %s\n", ++num, sa);
                    flag = 1;
                }
            }
            if (flag)
            {
                strncpy(sa, "", sizeof(sa));
            }
            else if ((sa[0] >= 'A' && sa[0] <= 'Z') || (sa[0] >= 'a' && sa[0] <= 'z'))
            {
                printf("%lld 标识符 %s\n", ++num, sa);
            }
            else
            {
                printf("%lld 数字 %s\n", ++num, sa);
            }
        }
        strncpy(sa, "", sizeof(sa));
    }
    return 0;
}
